Задана строка s. Определите, сможет ли она стать
палиндромом после удаления в точности одного символа.
Вход. Одна строка s
(1 ≤ длина(s) ≤ 10000).
Выход. Выведите yes,
если после удаления в точности одного символа строку s можно преобразовать в
палиндром, иначе вывести no. В случае ответа yes вывести во второй строке
результирующий палиндром. Если существует несколько решений, вывести любое.
Пример
входа 1 |
Пример
выхода 1 |
abccxba |
yes abccba |
|
|
Пример
входа 2 |
Пример
выхода 2 |
dsfsfasf |
no |
строки
Анализ алгоритма
Переберем все
буквы, поочередно каждую из них удаляем из строки. Если хотя бы одна из
полученных строк будет палиндромом, то ответ утвердительный.
Реализация алгоритма
Объявим рабочие строки.
string s, t;
Функция palindrom проверяет, является ли строка s палиндромом. Строка является палиндромом, если после
обращения она равна самой себе.
int palindrom(string s)
{
string sr = s;
reverse(sr.begin(),sr.end());
return s ==
sr;
}
Читаем входную строку.
cin >> s;
flag = 0;
Перебираем символы в строке s.
for (i = 0; i < s.size(); i++)
{
Удаляем из строки s i-ый символ, получаем строку t. Если t является палиндромом, то
устанавливаем flag = 1 и завершаем
обработку.
t = s.substr(0,i) + s.substr(i+1);
if (palindrom(t))
{
flag = 1;
break;
}
}
Выводим ответ в зависимости от значения переменной flag.
if (flag == 1)
cout << "yes\n"
<< t << endl;
else
cout << "no"
<< endl;